package handler

import (
	"net/http"
	"strconv"

	"pbj-server/internal/service"
	"pbj-server/pkg/logger"

	"github.com/gin-gonic/gin"
)

// SMSHandler SMS处理器
type SMSHandler struct {
	smsService *service.SMSService
}

// NewSMSHandler 创建SMS处理器实例
func NewSMSHandler(smsService *service.SMSService) *SMSHandler {
	return &SMSHandler{
		smsService: smsService,
	}
}

// SendSMS 发送短信验证码
// @Summary 发送短信验证码
// @Description 发送短信验证码到指定手机号
// @Tags 短信服务
// @Accept json
// @Produce json
// @Param sms body service.SendSMSRequest true "发送短信请求"
// @Success 200 {object} Response{data=service.SendSMSResponse} "发送成功"
// @Failure 400 {object} Response{data=string} "发送失败"
// @Router /sms/send [post]
func (h *SMSHandler) SendSMS(c *gin.Context) {
	var req service.SendSMSRequest
	
	// 绑定请求参数
	if err := c.ShouldBindJSON(&req); err != nil {
		logger.Warnf("发送短信参数绑定失败: %v", err)
		c.JSON(http.StatusBadRequest, Response{
			Code:    400,
			Message: "请求参数错误",
			Data:    err.Error(),
		})
		return
	}
	
	// 调用服务层发送短信
	response, err := h.smsService.SendSMS(&req)
	if err != nil {
		logger.Errorf("发送短信失败: %v", err)
		c.JSON(http.StatusInternalServerError, Response{
			Code:    500,
			Message: "发送失败",
		})
		return
	}
	
	// 根据服务层返回的结果设置状态码
	statusCode := http.StatusOK
	if !response.Success {
		statusCode = http.StatusBadRequest
	}
	
	c.JSON(statusCode, Response{
		Code:    200,
		Message: response.Message,
		Data:    response,
	})
}

// VerifyCode 验证短信验证码
// @Summary 验证短信验证码
// @Description 验证短信验证码是否正确
// @Tags 短信服务
// @Accept json
// @Produce json
// @Param verify body service.VerifyCodeRequest true "验证码验证请求"
// @Success 200 {object} Response{data=service.VerifyCodeResponse} "验证成功"
// @Failure 400 {object} Response{data=string} "验证失败"
// @Router /sms/verify [post]
func (h *SMSHandler) VerifyCode(c *gin.Context) {
	var req service.VerifyCodeRequest
	
	// 绑定请求参数
	if err := c.ShouldBindJSON(&req); err != nil {
		logger.Warnf("验证验证码参数绑定失败: %v", err)
		c.JSON(http.StatusBadRequest, Response{
			Code:    400,
			Message: "请求参数错误",
			Data:    err.Error(),
		})
		return
	}
	
	// 调用服务层验证验证码
	response, err := h.smsService.VerifyCode(&req)
	if err != nil {
		logger.Errorf("验证验证码失败: %v", err)
		c.JSON(http.StatusInternalServerError, Response{
			Code:    500,
			Message: "验证失败",
		})
		return
	}
	
	// 根据服务层返回的结果设置状态码
	statusCode := http.StatusOK
	if !response.Success {
		statusCode = http.StatusBadRequest
	}
	
	c.JSON(statusCode, Response{
		Code:    200,
		Message: response.Message,
		Data:    response,
	})
}

// GetSMSProvider 获取SMS提供商信息
// @Summary 获取SMS提供商
// @Description 获取当前使用的SMS服务提供商
// @Tags 短信服务
// @Accept json
// @Produce json
// @Success 200 {object} Response{data=string} "获取成功"
// @Router /sms/provider [get]
func (h *SMSHandler) GetSMSProvider(c *gin.Context) {
	provider := h.smsService.GetSMSProvider()
	
	c.JSON(http.StatusOK, Response{
		Code:    200,
		Message: "获取成功",
		Data:    provider,
	})
}

// ValidatePhone 验证手机号格式
// @Summary 验证手机号
// @Description 验证手机号格式是否正确
// @Tags 短信服务
// @Accept json
// @Produce json
// @Param phone query string true "手机号"
// @Success 200 {object} Response{data=bool} "验证结果"
// @Router /sms/validate-phone [get]
func (h *SMSHandler) ValidatePhone(c *gin.Context) {
	phone := c.Query("phone")
	if phone == "" {
		c.JSON(http.StatusBadRequest, Response{
			Code:    400,
			Message: "手机号不能为空",
		})
		return
	}
	
	isValid := h.smsService.ValidatePhoneNumber(phone)
	
	c.JSON(http.StatusOK, Response{
		Code:    200,
		Message: "验证完成",
		Data:    isValid,
	})
}

// GetSMSSendCount 获取短信发送次数（需要认证）
// @Summary 获取短信发送次数
// @Description 获取指定手机号的短信发送次数
// @Tags 短信服务
// @Accept json
// @Produce json
// @Security BearerAuth
// @Param phone query string true "手机号"
// @Success 200 {object} Response{data=int} "获取成功"
// @Failure 401 {object} Response{data=string} "未授权"
// @Router /sms/count [get]
func (h *SMSHandler) GetSMSSendCount(c *gin.Context) {
	phone := c.Query("phone")
	if phone == "" {
		c.JSON(http.StatusBadRequest, Response{
			Code:    400,
			Message: "手机号不能为空",
		})
		return
	}
	
	// 验证手机号格式
	if !h.smsService.ValidatePhoneNumber(phone) {
		c.JSON(http.StatusBadRequest, Response{
			Code:    400,
			Message: "手机号格式不正确",
		})
		return
	}
	
	// 获取发送次数
	count, err := h.smsService.GetSMSSendCount(phone)
	if err != nil {
		logger.Errorf("获取短信发送次数失败: %v", err)
		c.JSON(http.StatusInternalServerError, Response{
			Code:    500,
			Message: "获取失败",
		})
		return
	}
	
	c.JSON(http.StatusOK, Response{
		Code:    200,
		Message: "获取成功",
		Data:    count,
	})
}

// ResetSMSCount 重置短信发送次数（管理员功能）
// @Summary 重置短信发送次数
// @Description 管理员重置指定手机号的短信发送次数
// @Tags 短信服务
// @Accept json
// @Produce json
// @Security BearerAuth
// @Param phone query string true "手机号"
// @Success 200 {object} Response{data=string} "重置成功"
// @Failure 401 {object} Response{data=string} "未授权"
// @Router /sms/reset-count [post]
func (h *SMSHandler) ResetSMSCount(c *gin.Context) {
	phone := c.Query("phone")
	if phone == "" {
		c.JSON(http.StatusBadRequest, Response{
			Code:    400,
			Message: "手机号不能为空",
		})
		return
	}
	
	// 验证手机号格式
	if !h.smsService.ValidatePhoneNumber(phone) {
		c.JSON(http.StatusBadRequest, Response{
			Code:    400,
			Message: "手机号格式不正确",
		})
		return
	}
	
	// 重置发送次数
	if err := h.smsService.ResetDailyCount(phone); err != nil {
		logger.Errorf("重置短信发送次数失败: %v", err)
		c.JSON(http.StatusInternalServerError, Response{
			Code:    500,
			Message: "重置失败",
		})
		return
	}
	
	c.JSON(http.StatusOK, Response{
		Code:    200,
		Message: "重置成功",
		Data:    "短信发送次数已重置",
	})
}

// CheckDailyLimit 检查每日发送限制（需要认证）
// @Summary 检查每日发送限制
// @Description 检查指定手机号是否达到每日发送限制
// @Tags 短信服务
// @Accept json
// @Produce json
// @Security BearerAuth
// @Param phone query string true "手机号"
// @Param limit query int false "限制次数" default(10)
// @Success 200 {object} Response{data=bool} "检查结果"
// @Failure 401 {object} Response{data=string} "未授权"
// @Router /sms/check-limit [get]
func (h *SMSHandler) CheckDailyLimit(c *gin.Context) {
	phone := c.Query("phone")
	if phone == "" {
		c.JSON(http.StatusBadRequest, Response{
			Code:    400,
			Message: "手机号不能为空",
		})
		return
	}
	
	// 获取限制参数，默认为10次
	limitStr := c.DefaultQuery("limit", "10")
	limit := 10 // 默认值
	if parsedLimit, err := strconv.Atoi(limitStr); err == nil && parsedLimit > 0 {
		limit = parsedLimit
	}
	
	// 验证手机号格式
	if !h.smsService.ValidatePhoneNumber(phone) {
		c.JSON(http.StatusBadRequest, Response{
			Code:    400,
			Message: "手机号格式不正确",
		})
		return
	}
	
	// 检查限制
	canSend, err := h.smsService.CheckDailyLimit(phone, limit)
	if err != nil {
		logger.Errorf("检查每日发送限制失败: %v", err)
		c.JSON(http.StatusInternalServerError, Response{
			Code:    500,
			Message: "检查失败",
		})
		return
	}
	
	c.JSON(http.StatusOK, Response{
		Code:    200,
		Message: "检查完成",
		Data:    canSend,
	})
} 